package com.supersoul.myself.entity.base;

import lombok.Data;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Where;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.supersoul.myself.util.UUIDUtils;
import java.util.Date;

/**
 * 系统开发必备字段
 * @Data  lombok包提供, 帮助生成 get set方法, 不需要手动生成
 * @MappedSuperClass  只要继承了该类的实体, 生成表时会在表中生成 BaseEntity中的字段
 * @Where 在查询语句后添加的语句信息  is_delete =0 表示 只查未删除的数据
 */
@Data
@MappedSuperclass
@Where(clause = "is_delete = 0")
public class BaseEntity {

    // 三剑客  id 唯一性  createTime 这条数据创建时间, 定下来就不会变了.  updateTime: 只要变动了这条数据,就更新时间
    @Id
    @Column(name = "id", length = 64)
    @Size(max = 64, message = "id不能超过64个字符")
    private String id;

    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "create_time", nullable = false)
    private Date createTime;

    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(name = "update_time", nullable = false)
    private Date updateTime;

    // 逻辑删除, 方便数据恢复, 用空间换安全
    /**
     * 1 删除  0 未删除
     */
    @Column(name = "is_delete", nullable = false, columnDefinition = "int(11) comment '1删除, 0未删除'")
    private Integer isDelete;

    // 创建实体时, 初始化数据
    public void buildCreate() {
        this.id = UUIDUtils.generateUUID();
        this.isDelete = 0;
        Date date = new Date();
        this.createTime = date;
        this.updateTime = date;
    }
}
